
#ifndef UTILS_FUNCTIONAL_H
#define UTILS_FUNCTIONAL_H

#if defined(UTILS_ALL_BOOST_TR1)
#if !defined(UTILS_FUNCTIONAL_BOOST_TR1) \
    && !defined(UTILS_FUNCTIONAL_BOOST) \
    && !defined(UTILS_FUNCTIONAL_STANDARD) 
#define UTILS_FUNCTIONAL_BOOST_TR1
#endif
#elif defined(UTILS_ALL_BOOST)
#if !defined(UTILS_FUNCTIONAL_BOOST_TR1) \
    && !defined(UTILS_FUNCTIONAL_BOOST) \
    && !defined(UTILS_FUNCTIONAL_STANDARD) 
#define UTILS_FUNCTIONAL_BOOST
#endif
#elif defined(UTILS_ALL_STANDARD)
#if !defined(UTILS_FUNCTIONAL_BOOST_TR1) \
    && !defined(UTILS_FUNCTIONAL_BOOST) \
    && !defined(UTILS_FUNCTIONAL_STANDARD) 
#define UTILS_FUNCTIONAL_STANDARD
#endif
#else
#if !defined(UTILS_FUNCTIONAL_BOOST_TR1) \
    && !defined(UTILS_FUNCTIONAL_BOOST) \
    && !defined(UTILS_FUNCTIONAL_STANDARD) 
#define UTILS_FUNCTIONAL_STANDARD_TR1
#endif
#endif

#if defined(UTILS_FUNCTIONAL_BOOST_TR1)
#include <boost/tr1/functional.hpp>
namespace utils {
	using std::tr1::function;
	using std::tr1::bind;
	namespace placeholders = std::tr1::placeholders;
}
#elif defined(UTILS_FUNCTIONAL_BOOST)
#include <boost/function.hpp>
#include <boost/bind.hpp>
namespace utils {
  using ::boost::function;
  using ::boost::bind;
  namespace placeholders {
    using ::_1; 
    using ::_2;
    using ::_3;
    using ::_4;
    using ::_5;
    using ::_6;
    using ::_7;
    using ::_8;
    using ::_9;
  }
}
#elif defined(UTILS_FUNCTIONAL_STANDARD)
#include <functional>
namespace utils {
	using std::function;
	using std::bind;
	namespace placeholders = std::placeholders;
}
#elif defined(UTILS_FUNCTIONAL_STANDARD_TR1)
#include <tr1/functional>
namespace utils {
	using std::tr1::function;
	using std::tr1::bind;
	namespace placeholders = std::tr1::placeholders;
}
#endif

#endif // UTILS_FUNCTIONAL_H

